# -*- coding: utf-8 -*-
# 作者：秋禊
import cv2

# 创建识别模型，使用LBPHFace算法识别，Confidence评分低于50是可靠
# LBP是一种特征提取方式，能提取出图像的局部的纹理特征
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('face_trainer/trainer.yml')
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
font = cv2.FONT_HERSHEY_SIMPLEX# 字体

idnum = 0
names = ['one', 'two']

# 调用笔记本内置摄像头，所以参数为0，如果有其他的摄像头可以调整参数为1，2
cam = cv2.VideoCapture(0)

#设置大小
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)

while True:
    # 从摄像头读取图片
    ret, img = cam.read()

    # 把读取图片，转换为灰度图片
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 图片中的每一张人脸大小不同，矩形框也不一样大，把检测到的矩形框大x,y,w,h, 列表形式返回
    # 如果没有检测到面部，返回一个元组
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.2,    # 指定在每个图像尺度上缩小多少
        minNeighbors=5,     # 指定每个候选矩形应该保留多少个邻居。
        minSize=(int(minW), int(minH))  # 最小对象大小的值。小于该值的对象将被忽略
       #minSize和maxSize用来限制得到的目标区域的范围
    )
    # 绘制矩形
    # 图片的x轴、y轴位置，w表示宽、h表示高
    for (x, y, w, h) in faces:
        cv2.rectangle(img,  # 矩形
                      pt1 = (x, y), #矩形的顶点
                      pt2 = (x+w, y+h), # pt1的对角点
                      color = (0, 255, 0), # 矩形颜色或亮度(灰度图像)。
                      thickness = 2 # 矩形边框的厚度
                      )
        # 返回侦测到的人脸的id和近似度conf（数字越大和训练数据越不像）
        idnum, confidence = recognizer.predict(gray[y:y+h, x:x+w])

        if confidence < 100:
            idnum = names[idnum]
            confidence = "{0}%".format(round(100 - confidence))
        else:
            idnum = "unknown"
            confidence = "{0}%".format(round(100 - confidence))
        # 方框上的名字
        cv2.putText(img, str(idnum), (x+5, y-5), font, 1, (255, 0, 0), 1)
        # 百分比
        cv2.putText(img, str(confidence), (x+5, y+h-5), font, 1, (255, 255, 255), 1)

    # 显示指定窗口中的图像
    cv2.imshow('Face recognition', img)
    #按 Esc 键退出
    k = cv2.waitKey(10)
    if k == 27:
        break
#
cam.release()
# 关闭窗口
cv2.destroyAllWindows()